﻿//----------------------------------------------------------------
// Desc: 
// Edit: ShowLong, http://blog.csdn.net/showlong
//
// Date Created: 2009-10-15
//
// Update Date :            
//
// Copyright (c) Fuel4D (http://www.fuel4d.com), All rights reserved.
//
//----------------------------------------------------------------
#pragma once


class FUI_Frame;


class FAPI FUI_Menu : public IFUI_MemObject
{
    FUI_DECLARE_CLASS(FUI_Menu);

    friend class FUI_System;

public:
    struct MENU_ITEM 
    {
        FUI_DECLARE_STRUCT(MENU_ITEM)

        friend class FUI_Menu;

        typedef FUI_Vector< MENU_ITEM* > fuv_fu_menu_pitem;

    protected:
        MENU_ITEM();
        void Draw(fuPoint* pt);
        MENU_ITEM* Get(fuPoint* pt, funit mx, funit my);
        int size(){ return (int)vPopTable.size(); }
        MENU_ITEM* add(const WCHAR* text, DWORD id, DWORD color = 0);
        MENU_ITEM* add(const ACHAR* text, DWORD id, DWORD color = 0);
        fuRect& my_rect(fuRect& rc, fuPoint* pt);
        fuPoint& pop_position(fuPoint& pop_pt, int idx, fuRect& my_rc);

        FUI_Menu* uMenu;
        int nOpenIndex;
        FUI_StringW szText;
        MENU_ITEM* pParent;
        fuv_fu_menu_pitem vPopTable;
        fuPicture uIcon;
        DWORD dwCallID;     // 菜单事件的回调 ID
        DWORD nWidth;       // 在弹出菜单前表示串占象素宽度/弹出后指的本块宽度

    public:
        DWORD dwColor;      // 菜单文字颜色
        DWORD dwUID;        // 用户数据
        DWORD dwDWPtr;      // 用户数据
        bool bTxtIndent;    // 是否启用文字缩进

        void Release();
        void SetIcon(FIDHASH res_file, FIDHASH pic);
        void RefWidth();
        FINLINE void SetText(const ACHAR* txt){ szText = txt; }
        FINLINE void SetText(const WCHAR* txt){ szText = txt; }
    };

protected:
    FUI_Menu();
    ~FUI_Menu();

    void Release();
    void Clear();
    void Draw();
    bool OnMouseMove(funit x, funit y);
    bool OnLButtonDown(funit x, funit y);
    bool OnLButtonUp(funit x, funit y);
    bool OnRButtonDown(funit x, funit y);
    bool OnRButtonUp(funit x, funit y);

public:
    // 菜单是否有效，即是否已经弹出
    bool IsValid();
    // 创建菜单
    // .nTypeID 用户数据，菜单系统不处理，可通过GetMenuTypeID获取设置的数据
    // .resindex 在UI编辑器中的预置数据索引
    bool CreateMenu(DWORD nTypeID, BYTE resindex);
    // 添加菜单项
    // .text 菜单显示文本
    // .id 菜单回调的时候传回的事件ID
    // .father 父菜单节点，根节点填0
    // .color 菜单项的文字颜色，0表示默认颜色
    MENU_ITEM* AddMenuItem(const WCHAR* text, DWORD id, MENU_ITEM* father = 0, DWORD color = 0);
    MENU_ITEM* AddMenuItem(const ACHAR* text, DWORD id, MENU_ITEM* father = 0, DWORD color = 0);
    // 弹出菜单
    // .layout 菜单事件接收者（事件eUET_MenuCall）
    bool PopMenu(FUI_Layout* layout, funit x, funit y);
    // 取得菜单ID
    DWORD GetMenuTypeID() { return dwMenuTypeID; }
    // 关闭菜单
    void CloseMenu();

protected:
    FUI_System* pUIMgr;
    DWORD dwMenuTypeID;
    MENU_ITEM pRootMenu;
    fuPoint uDrawPoint;
    fuMenuGroup* pMenuData;
    FUI_Frame* pUIFrame;
    int nTextFrame;
};